package com.sky.myapplication.kotlin.`class`

import android.util.Log

/**
 * Created by Min
 * Date 2023/2/9  14:16
 */

//classModifier: 类属性修饰符，标示类本身特性。
//abstract    // 抽象类
//final       // 类不可继承，默认属性
//enum        // 枚举类
//open        // 类可继承，类默认是final的
//annotation  // 注解类

//accessModifier: 访问权限修饰符
//private    // 仅在同一个文件中可见
//protected  // 同一个文件中或子类可见
//public     // 所有调用的地方都可见
//internal   // 同一个模块中可见

//Kotlin 类可以包含：构造函数和初始化代码块、函数、属性、内部类、对象声明。Kotlin 中使用关键字 class 声明类，后面紧跟类名：
open class PersonKotlin constructor(val worker: String) : AbstractPersonKotlin(){// 类名为 Runoob, 大括号内是类体构成

    // class Empty{} //空类

    //如果一个非抽象类没有声明构造函数(主构造函数或次构造函数)，它会产生一个没有参数的构造函数。构造函数是 public 。如果你不想你的类有公共的构造函数，你就得声明一个空的主构造函数：
    class Student private constructor(val name: String){

    }

    init {
        Log.i("mxp", "PersonKotlin init()");
    }

    //如果类有主构造函数，每个次构造函数都要，或直接或间接通过另一个次构造函数代理主构造函数。在同一个类中代理另一个构造函数使用 this 关键字：
    constructor(worker: String, compeny: String) : this(worker){

    }


//    getter 和 setter
//    属性声明的完整语法：
//    var <propertyName>[: <PropertyType>] [= <property_initializer>]
//    [<getter>]
//    [<setter>]
    var name: String = "lion"//属性定义 类的属性可以用关键字 var 声明为可变的，否则使用只读关键字 val 声明为不可变。
        get() = field + "..."
        set(value){
            if (value.equals("")){
                field = "this is empty"
            }
        }

    open val age: Int = 10

    //open 允许子类重写
    open fun sayName(){// 成员函数
        Log.i("mxp", "my name is lion")
    }


    override fun printLog() {
        super.printLog()
    }

    //嵌套类
    class Fruit {
        fun color() = 2
    }

    //内部类 内部类使用 inner 关键字来表示。
    //内部类会带有一个对外部类的对象的引用，所以内部类可以访问外部类成员属性和成员函数。
    //为了消除歧义，要访问来自外部作用域的 this，我们使用this@label，其中 @label 是一个 代指 this 来源的标签。
    inner class InnerFruit{
        var color = name
        var colorTwo = this@PersonKotlin

        fun print() = name
        fun printColor(){
            var thisColor = this@PersonKotlin
            Log.i("mxp", "PersonKotlin InnerFruit print color..." + thisColor.name)
        }
    }
}